package pl.pw.gis.gc_sa.algo;

import pl.pw.gis.gc_sa.data.Graph;
import pl.pw.gis.gc_sa.data.VertexChange;

/**
 * Klasa reprezentujaca biezacy "stan funkcji kosztu" kolorowania grafu.
 * Przechowujac dane o licznosci klas kolorow oraz liczbie konfliktow w kazdej z
 * nich, pozwala na szybkie obliczanie nowego kosztu, na podstawie informacji o
 * id i nowym kolorze wierzcholka
 * 
 * @author Lukasz
 * 
 */
public abstract class Cost {
    protected Graph mGraph;
    protected int[] mSolution;
    protected int mCost;

    /**
     * Konstruktor klasy.
     * 
     * @param graph
     *            graf dla ktorego przeprowadzane jest kolorowanie
     * @param solution
     *            poczatkowe rozwiazanie
     */
    Cost(Graph graph, int[] solution) {
        mGraph = graph;
        mSolution = solution;
    }

    /**
     * Metoda zwraca biezacy koszt rozwiazania
     * 
     * @return
     */
    public int getCurrentCost() {
        return mCost;
    }

    /**
     * Zwraca koszt kolorowania, po wprowadzenie zadanej zmiany
     * 
     * @param vc
     *            obiekt opisujacy zmiane
     * 
     * @return wyliczony koszt po zmianie
     */
    public abstract int costAfterChange(VertexChange change);

    /**
     * Metoda odswieza pola klasy na podstawie wprowadzonych zmian oraz
     * aktualizuje biezaca wartosc kosztu
     * 
     * @param vc
     *            obiekt zawierajacy informacje o zmianach
     * @param newCost
     *            nowa biezaca wartosc kosztu
     */
    public abstract void applyChange(VertexChange change, int currentCost);

}
